package com.systop.ltbook.sms.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.xwork.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.systop.common.modules.security.user.UserConstants;
import com.systop.common.modules.security.user.model.User;
import com.systop.core.service.BaseGenericsManager;
import com.systop.ltbook.sms.SmsConstants;
import com.systop.ltbook.sms.model.SmsSend;
import com.systop.ltbook.sms.smscfg.model.SmsCfg;
import com.systop.ltbook.sms.smscfg.service.SmsCfgManager;
import com.systop.ltbook.sms.statistics.util.Utils;

/**
 * 短息发送管理
 * @author DU
 */
@Service
public class SmsSendManager extends BaseGenericsManager<SmsSend>{

	@Autowired
	private SmsCfgManager smsCfgManager;
	
	/**
   * 得到需要发送的短信方法(最大记录数由系统变量限定)
   */
  public List<SmsSend> getNewSmsSends() {
    // 查询新短信并且以短信记录创建时间早晚排序
    StringBuffer buf = new StringBuffer("from SmsSend ss where ss.isNew = ");
    buf.append(SmsConstants.SMS_SEND_IS_NEW);
    buf.append(" order by ss.createTime");

    List<SmsSend> smsSends = query(buf.toString());
    // 如果得到的记录数大于系统所指定的一次发送记录数,则只取得指定的记录
    if (smsSends.size() > SmsConstants.SMS_SEND_COUNT) {
      return smsSends.subList(0, SmsConstants.SMS_SEND_COUNT - 1);
    }

    return smsSends;
  }
  
	/**
   * 取得发送短信的具体内容
   * @param smsId 短信ID
   */
  @SuppressWarnings("unchecked")
  public Map getSmsMapById(String smsId) {
    Map map = new HashMap();
    if (StringUtils.isNotBlank(smsId) && StringUtils.isNumeric(smsId)) {
      SmsSend smsSend = get(Integer.valueOf(smsId));
      if (smsSend != null) {
        map.put("mobileNum", smsSend.getMobileNum());
        map.put("receiver", smsSend.getReceiverName());
        map.put("sendTime", smsSend.getSendTime());
        map.put("content", smsSend.getContent());
      }
    }

    return map;
  }
  
  /**
   * 取得用户本月剩余短信条数
   * @param user
   */
	public Integer getSmsSendRemainSize(User user) {
		Integer remSize = 0;
		SmsCfg smsCfg = smsCfgManager.get();
		if (user != null) {
			//公司员工
			if (UserConstants.USER_TYPE_STAFF.equals(user.getType())){
				if (smsCfg != null && smsCfg.getStaffSize() != null) {
					//剩余短信条数=额定发送数-已发短信条数
					remSize = smsCfg.getStaffSize() - getSmsSendedSize(user);
				} else {//如果没有配置额定发送条数，则使用默认配置数-已发短信条数
					remSize = SmsConstants.SMS_SEND_SIZE_STAFF - getSmsSendedSize(user);
				}
			}
			//代理商
			if (UserConstants.USER_TYPE_AGENTS.equals(user.getType())) {
				if (smsCfg != null && smsCfg.getAgentSize() != null) {
					//剩余短信条数=额定发送数-已发短信条数
					remSize = smsCfg.getAgentSize() - getSmsSendedSize(user);
				} else {//如果没有配置额定发送条数，则使用默认配置数-已发短信条数
					remSize = SmsConstants.SMS_SEND_SIZE_AGENT - getSmsSendedSize(user);
				}
			}
		}
		if (remSize < 0) {
			remSize = 0;
		}
		return remSize;
	}
	
	/**
	 * 取得用户本月已经发送短信的数量
	 * @param user
	 */
	@SuppressWarnings("unchecked")
  private Integer getSmsSendedSize(User user) {
		int sendCount = 0;
		if (user != null) {
			Date firstDate = Utils.getFirstDayOfMonth(new Date());
			Date lastDate = Utils.getLastDayOfMonth(new Date());
			StringBuffer hql = new StringBuffer("from SmsSend ss where 1=1 ");
			List args = new ArrayList();
			//该用户发送的短信
			hql.append(" and ss.sender.id = ?");
			args.add(user.getId());
			if (firstDate != null && lastDate != null) {
				hql.append(" and ss.sendTime between ? and ?");
				args.add(firstDate);
				args.add(lastDate);
			}
			List<SmsSend> smsRst = getDao().query(hql.toString(), args.toArray());
			for (SmsSend sms : smsRst) {
				sendCount += sms.getSmsNums();
			}
		}
		
		return sendCount;
	}
}
